package models

import (
	"fmt"
	"gvb-server/Request"
	"gvb-server/global"
	"gvb-server/utils"
	"time"
)

type Menu struct {
	ID           uint                 `gorm:"primaryKey" json:"id"`
	CreateDate   int64                `json:"create_date"`
	UpdateDate   int64                `json:"-"`
	MenuTitle    string               `gorm:"size:30" json:"menu_title"`
	Path         string               `gorm:"size:256" json:"path"`
	Slogan       string               `gorm:"size:64" json:"slogan"`
	Abstract     Request.ArticleArray `gorm:"type:string" json:"abstract"` // 简介
	AbstractTime int                  `json:"abstract_time"`               // 简介切换时间
	Banners      []BannerData         `gorm:"-" json:"banner"`             // 菜单图片列表 自动会去关联这个结构体 使用外建
	Bid          uint                 `gorm:"-" json:"bid"`
	BannerTime   int                  `json:"banners_time"`        // 菜单切换时间 0 不切换
	Sort         int                  `gorm:"size:10" json:"sort"` // 菜单的顺序
	DeletedAt    int64                `json:"deleted_at"`
	Status       int                  `gorm:"default:1" json:"status"`
}

type BannerData struct {
	ID   string `json:"id"`
	Path string `json:"path"`
	Name string `json:"name"`
}

// MenuCreateData 新增修改
func MenuCreateData(i Request.MenuCreateRequest) (Pub utils.PubStatus) {

	Pub.Status = utils.ERROR

	var mc Menu
	var id uint
	var err error

	id = i.ID
	mc.CreateDate = time.Now().Unix()
	mc.MenuTitle = i.MenuTitle
	mc.Slogan = i.Slogan
	mc.Abstract = i.Abstract
	mc.AbstractTime = i.AbstractTime
	mc.BannerTime = i.BannerTime
	mc.Sort = i.Sort

	// 开启事务
	tx := global.DB.Begin()
	if id == 0 {
		err = tx.Create(&mc).Error
		Pub.Msg = "添加成功"
		id = mc.ID
		if err != nil {
			tx.Rollback()
			return
		}

	} else {
		Pub.Msg = "修改成功"
		var edit = map[string]any{"status": 0, "deleted_at": time.Now().Unix()}
		err = tx.Table("menus").Where("id = ?", id).Updates(&mc).Error
		if err != nil {
			tx.Rollback()
			return
		}
		err = tx.Table("menu_banners").Where("menu_id = ?", id).Updates(edit).Error
		if err != nil {
			tx.Rollback()
			return
		}
	}

	var menuBanner []MenuBanner
	for _, v := range i.ImageSortList {
		// 最好加判断 这个id是否真有这张图片
		menuBanner = append(menuBanner, MenuBanner{
			MenuID:   id,
			BannerID: v.ImageID,
			Sort:     v.Sort,
		})
	}

	err = tx.Create(&menuBanner).Error
	if err != nil {
		tx.Rollback()
		Pub.Msg = "添加失败"
		return
	}

	tx.Commit()
	Pub.Status = utils.SUCCESS
	return
}

func MenuDelByIds(s Request.MenuDelRequest) {
	global.DB.Table("Menus").Where("id IN ?", s.Ids).Updates(map[string]interface{}{"status": 2})
}

// MenuUpdateByIds 弃用，和新增走同一个方法
func MenuUpdateByIds(s Request.MenuEditRequest) {

	// 先清空之前的关联
	global.DB.Table("menus_banner").Where("menu_id = ?", s.Id).Update("status", 0)

	fmt.Println(s)
	fmt.Println("==============")
	// 可以使用第三方包 structs把结构体转成map 然后更新， 需要在结构体中使用  structs:"title"
	//m := structs.Map(s) // 接收结构体 转map
	//fmt.Println(m)
	//global.DB.Table("Menus").Where("id IN ?", s.Id).Updates(map[string]interface{}{"title": s.Title})
	//global.DB.Table("Menus").Where("id IN ?", s.Id).Update("name", "hello")                   // 更新一个列
	//global.DB.Table("Menus").Where("id IN ?", s.Id).Updates(map[string]any{"title": s.Title}) // 方法二
}
